package main

import (
	"sync"
	"time"
	"math/rand"
)

var(
	//随机数互斥锁，抢到锁的协程才能执行GetRandomInt，避免并发访问
	randomMutex sync.Mutex
)

/*
获得[start,end]之间的随机数
*/
func GetRandomInt(start, end int) int {
	/*
	抢到锁才能访问这个函数，原因如下：
	时间纳秒作为随机数种子，并发访问时，两条协程的时间纳秒完全相同时，即种子相同，获得的随机数就是相同的
	*/
	randomMutex.Lock()

	//阻塞1纳秒，确保两次同步访问所使用的时间种子不同
	<-time.After(1 * time.Nanosecond)
	//创建Rand对象指针（固定用法）
	r := rand.New(rand.NewSource(	time.Now().UnixNano()	))
	//生成随机数
	ret := start + r.Intn(end-start)

	//释放互斥锁，供其它协程调用
	randomMutex.Unlock()
	return ret
}
